From 3593f4b7bfe25ca9f31dcd2ade93ef3da5baf7f6 Mon Sep 17 00:00:00 2001 From: Debian OpenLDAP Maintainers Date: Sun, 16 Jul 2017 20:57:41 +0100 Subject: [PATCH] libldap-symbol-versions Add symbol versioning to the public LDAP libraries. This is required for library transitions, such as the current transition from 2.1 to 2.4, since programs will sometimes have both libraries loaded by different dependency chains during the transition. Not yet contributed upstream. Upstream ITS #5365 filed requesting symbol versioning for libldap and libber. Gbp-Pq: Name libldap-symbol-versions --- build/openldap.m4 | 51 +++++++++++++++++++++++++++++++++ build/top.mk | 5 +++- configure.in | 7 +++++ libraries/liblber/Makefile.in | 3 ++ libraries/liblber/liblber.map | 8 ++++++ libraries/libldap/Makefile.in | 3 ++ libraries/libldap/libldap.map | 7 +++++ libraries/libldap_r/Makefile.in | 3 ++ 8 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 libraries/liblber/liblber.map create mode 100644 libraries/libldap/libldap.map diff --git a/build/openldap.m4 b/build/openldap.m4 index 37c20d0f..c162e16f 100644 --- a/build/openldap.m4 +++ b/build/openldap.m4 @@ -1142,3 +1142,54 @@ AC_DEFUN([OL_SSL_COMPAT], #endif ], [ol_cv_ssl_crl_compat=yes], [ol_cv_ssl_crl_compat=no])]) ]) + +dnl ==================================================================== +dnl check for symbol versioning support +AC_DEFUN([OL_SYMBOL_VERSIONING], +[AC_CACHE_CHECK([for .symver assembler directive], + [ol_cv_asm_symver_directive],[ +cat > conftest.s <&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + ol_cv_asm_symver_directive=yes +else + ol_cv_asm_symver_directive=no +fi +rm -f conftest*]) +AC_CACHE_CHECK([for ld --version-script], + [ol_cv_ld_version_script_option],[ +if test $ol_cv_asm_symver_directive = yes; then + cat > conftest.s < conftest.map <&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + if AC_TRY_COMMAND([${CC-cc} $CFLAGS $LDFLAGS -shared + -o conftest.so conftest.o + -Wl,--version-script,conftest.map + 1>&AS_MESSAGE_LOG_FD]); + then + ol_cv_ld_version_script_option=yes + else + ol_cv_ld_version_script_option=no + fi + else + ol_cv_ld_version_script_option=no + fi +else + ol_cv_ld_version_script_option=no +fi +rm -f conftest*])]) diff --git a/build/top.mk b/build/top.mk index 1dc588c1..7aa84f20 100644 --- a/build/top.mk +++ b/build/top.mk @@ -104,6 +104,9 @@ LTFLAGS_MOD = $(@PLAT@_LTFLAGS_MOD) # LINK_LIBS referenced in library and module link commands. LINK_LIBS = $(MOD_LIBS) $(@PLAT@_LINK_LIBS) +# option to pass to $(CC) to support library symbol versioning, if any +VERSION_OPTION = @VERSION_OPTION@ + LTSTATIC = @LTSTATIC@ LTLINK = $(LIBTOOL) --mode=link \ @@ -113,7 +116,7 @@ LTCOMPILE_LIB = $(LIBTOOL) $(LTONLY_LIB) --mode=compile \ $(CC) $(LT_CFLAGS) $(LT_CPPFLAGS) $(LIB_DEFS) -c LTLINK_LIB = $(LIBTOOL) $(LTONLY_LIB) --mode=link \ - $(CC) $(LT_CFLAGS) $(LDFLAGS) $(LTFLAGS_LIB) + $(CC) $(LT_CFLAGS) $(LDFLAGS) $(LTFLAGS_LIB) $(VERSION_FLAGS) LTCOMPILE_MOD = $(LIBTOOL) $(LTONLY_MOD) --mode=compile \ $(CC) $(LT_CFLAGS) $(LT_CPPFLAGS) $(MOD_DEFS) -c diff --git a/configure.in b/configure.in index 15c0dfcc..ddee9886 100644 --- a/configure.in +++ b/configure.in @@ -1916,6 +1916,13 @@ else fi AC_SUBST(LTSTATIC)dnl +VERSION_OPTION="" +OL_SYMBOL_VERSIONING +if test $ol_cv_ld_version_script_option = yes ; then + VERSION_OPTION="-Wl,--version-script=" +fi +AC_SUBST(VERSION_OPTION) + dnl ---------------------------------------------------------------- if test $ol_enable_wrappers != no ; then AC_CHECK_HEADERS(tcpd.h,[ diff --git a/libraries/liblber/Makefile.in b/libraries/liblber/Makefile.in index 779ed9d0..b417659a 100644 --- a/libraries/liblber/Makefile.in +++ b/libraries/liblber/Makefile.in @@ -38,6 +38,9 @@ XLIBS = $(LIBRARY) $(LDAP_LIBLUTIL_A) XXLIBS = NT_LINK_LIBS = $(AC_LIBS) UNIX_LINK_LIBS = $(AC_LIBS) +ifneq (,$(VERSION_OPTION)) + VERSION_FLAGS = "$(VERSION_OPTION)$(srcdir)/liblber.map" +endif dtest: $(XLIBS) dtest.o $(LTLINK) -o $@ dtest.o $(LIBS) diff --git a/libraries/liblber/liblber.map b/libraries/liblber/liblber.map new file mode 100644 index 00000000..b54853c0 --- /dev/null +++ b/libraries/liblber/liblber.map @@ -0,0 +1,8 @@ +OPENLDAP_2.4_2 { + global: + ber_*; + der_alloc; + lutil_*; + local: + *; +}; diff --git a/libraries/libldap/Makefile.in b/libraries/libldap/Makefile.in index 0b324250..240c005f 100644 --- a/libraries/libldap/Makefile.in +++ b/libraries/libldap/Makefile.in @@ -52,6 +52,9 @@ XLIBS = $(LIBRARY) $(LDAP_LIBLBER_LA) $(LDAP_LIBLUTIL_A) XXLIBS = $(SECURITY_LIBS) $(LUTIL_LIBS) NT_LINK_LIBS = $(LDAP_LIBLBER_LA) $(AC_LIBS) $(SECURITY_LIBS) UNIX_LINK_LIBS = $(LDAP_LIBLBER_LA) $(AC_LIBS) $(SECURITY_LIBS) +ifneq (,$(VERSION_OPTION)) + VERSION_FLAGS = $(VERSION_OPTION)$(srcdir)/libldap.map +endif apitest: $(XLIBS) apitest.o $(LTLINK) -o $@ apitest.o $(LIBS) diff --git a/libraries/libldap/libldap.map b/libraries/libldap/libldap.map new file mode 100644 index 00000000..605dcffa --- /dev/null +++ b/libraries/libldap/libldap.map @@ -0,0 +1,7 @@ +OPENLDAP_2.4_2 { + global: + ldap_*; + ldif_*; + local: + *; +}; diff --git a/libraries/libldap_r/Makefile.in b/libraries/libldap_r/Makefile.in index 29589d90..9d3bdb47 100644 --- a/libraries/libldap_r/Makefile.in +++ b/libraries/libldap_r/Makefile.in @@ -61,6 +61,9 @@ XXLIBS = $(SECURITY_LIBS) $(LUTIL_LIBS) XXXLIBS = $(LTHREAD_LIBS) NT_LINK_LIBS = $(LDAP_LIBLBER_LA) $(AC_LIBS) $(SECURITY_LIBS) UNIX_LINK_LIBS = $(LDAP_LIBLBER_LA) $(AC_LIBS) $(SECURITY_LIBS) $(LTHREAD_LIBS) +ifneq (,$(VERSION_OPTION)) + VERSION_FLAGS = "$(VERSION_OPTION)$(XXDIR)/libldap.map" +endif .links : Makefile @for i in $(XXSRCS); do \ -- 2.30.2